﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Systemet.Technical
{
    /// <summary>
    /// Denna klass används för att hantera databasutfrågningsar som berör aktiviteter och aktivitetskostnader.
    /// Klassen används dessutom för att returnera rätt information till DataGridView.
    /// </summary>
    class AktivitetConnection
    {
        private LinqToSQLDataContext database;
        private string pass = AccessController.Instance.Connection;

        //Hämta aktiviteter och returnerar en lista av dem för sidofiltreringar med aktivitetsrelaterade comboboxar.
        public IEnumerable<Aktivietetsregister> getFiltreringskriterier()
        {
            try
            {
                database = new LinqToSQLDataContext(pass);

                IEnumerable<Aktivietetsregister> aktiviteter = from Aktivietetsregister in database.Aktivietetsregisters
                                                               select Aktivietetsregister;


                //List<Aktivitet> aktivitetlista = aktiviteter.AsEnumerable()
                //                .Select(a => new Aktivitet
                //                {
                //                    Aktivitetnamn = a.aktivitet,
                //                    AktivitetsID = a.aktivitetsID,
                //                    Avdelningsnamn = a.avdelningsnamn,
                //                    Signerad = a.signatur,
                //                    AndratDatum = (DateTime)a.andratDatum
                //                }).ToList();
                //database.Connection.Close();
                return aktiviteter;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }
        //Hämta datagridview filtrering med filtreringskriterier
        public IEnumerable<Aktivietetsregister> GetAktivitet(string Avd, string Namn, string AktivID)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);


                IEnumerable<Aktivietetsregister> aktiviter = from Aktivitetsregistrering in database.Aktivietetsregisters
                                                             where (Aktivitetsregistrering.avdelningsnamn.Contains(Avd) &&
                                                             (Aktivitetsregistrering.aktivitet.Contains(Namn) &&
                                                             (Aktivitetsregistrering.aktivitetsID.Contains(AktivID))))
                                                             select Aktivitetsregistrering;
                // select new { Aktivitet.aktivitetsID, Aktivitet.aktivitet, Aktivitet.avdelningsnamn, Aktivitet.andratDatum, Aktivitet.signatur };

                //List<Aktivitet> aktivitetlista = aktiviter.AsEnumerable()
                //    .Select(a => new Aktivitet
                //    {
                //        Aktivitetnamn = a.aktivitet,
                //        AktivitetsID = a.aktivitetsID,
                //        Avdelningsnamn = a.avdelningsnamn,
                //        Signerad = a.signatur,
                //        AndratDatum = (DateTime)a.andratDatum
                //    }).ToList();
                database.Connection.Close();
                return aktiviter;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        //Tar in ett objekt av typen Aktivitet för att köra en insert i databasen
        public bool Aktivitetsregistrering(Aktivietetsregister aktivitetsObject)
        {
            try
            {
                Aktivietetsregister nyAktivitet = new Aktivietetsregister
                {
                    aktivitetsID = aktivitetsObject.aktivitetsID,
                    aktivitet = aktivitetsObject.aktivitet,
                    signatur = aktivitetsObject.signatur,
                    andratDatum = (DateTime)DateTime.Now,
                    avdelningsnamn = aktivitetsObject.avdelningsnamn

                };

                database.Aktivietetsregisters.InsertOnSubmit(nyAktivitet);
                database.SubmitChanges();
                database.Connection.Close();
                return true;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }

        //Tar in ett aktivitetsobjekt och uppdaterar databasens överensstämmande objekt
        public bool Updateaktivitetregister(Aktivietetsregister aktivitetsObject)
        {
            Aktivietetsregister uppdateraAktiviteter = database.Aktivietetsregisters.Single(p => p.aktivitetsID == aktivitetsObject.aktivitetsID);
            try
            {
                uppdateraAktiviteter.aktivitet = aktivitetsObject.aktivitet;
                uppdateraAktiviteter.andratDatum = aktivitetsObject.andratDatum;
                uppdateraAktiviteter.signatur = aktivitetsObject.signatur;


                database.SubmitChanges();
                database.Connection.Close();
                return true;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }

        //Tar fram aktivitetskostnad för en specifik avdelning
        public List<AktivitetsKostnad> GetAktivitetskostnadAvdelning(string avdelningsID)
        {
            try
            {
                database = new LinqToSQLDataContext(pass);
                List<AktivitetsKostnad> listofAktivitetsKostnadAvdelning = new List<AktivitetsKostnad>();

                var q = from Aktivitetsregister in database.Aktivietetsregisters
                        join Aktivitetskostnad in database.Aktivitetskostnads on Aktivitetsregister.aktivitetsID equals Aktivitetskostnad.aktivitetsID
                        where Aktivitetsregister.avdelningsnamn == avdelningsID
                        select Aktivitetskostnad;


                foreach (Aktivitetskostnad ak in q)
                {
                    AktivitetsKostnad akost = new AktivitetsKostnad();

                    akost.AktivitetsID = ak.aktivitetsID;
                    akost.Belopp = ak.belopp;
                    akost.Kontonummer = ak.kontonummer;

                    listofAktivitetsKostnadAvdelning.Add(akost);
                }

                database.Connection.Close();
                return listofAktivitetsKostnadAvdelning;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }
    }
}
